﻿#region Namespaces

using System;
using System.Collections.Generic;

using Vibstudio.X4NET.Collections;
using Vibstudio.X4NET.Test.Util;
using Vibstudio.X4NET.Xml.Extraction;
using Vibstudio.X4NET.Xml.Linq;
using Vibstudio.X4NET.Xml.XPath;

using Microsoft.VisualStudio.TestTools.UnitTesting;

#endregion

namespace Vibstudio.X4NET.Test
{
    [TestClass]
    public class XmlExtractionTests
    {
        private const string FILE_NAME = "SM2_0303_2015015.xml";

        [TestMethod]
        public void GetXPathsFromUri()
        {
            List<string> expected = new XPathList();
            expected.Add("/Prestazione/@cod_servizio");
            expected.Add("/Prestazione/@cod_flusso");
            expected.Add("/Prestazione/IdentificativiRichiesta/piva_utente");
            expected.Add("/Prestazione/IdentificativiRichiesta/piva_distr");
            expected.Add("/Prestazione/IdentificativiRichiesta/cod_prat_utente");
            expected.Add("/Prestazione/IdentificativiRichiesta/cod_prat_distr");
            expected.Add("/Prestazione/DatiTecnici/cod_pdr");
            expected.Add("/Prestazione/data_ese");

            Uri uri = new Uri(IOHelper.ComposeSampleFilePath(FILE_NAME).Path);

            OperationResult<XPathList> actual = new XmlExtractor().GetXPaths(uri, false, false, true);

            Assert.IsTrue(actual.Output.RootName.Equals("Prestazione"));
            Assert.IsTrue(expected.CompareList(actual.Output));
        }

        [TestMethod]
        public void GetXPathsFromDocument_Positional()
        {
            List<string> expected = new XPathList();
            expected.Add("/Prestazione/@cod_servizio");
            expected.Add("/Prestazione/@cod_flusso");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/piva_utente[1]");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/piva_distr[1]");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/cod_prat_utente[1]");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/cod_prat_distr[1]");
            expected.Add("/Prestazione/DatiTecnici[1]/cod_pdr[1]");
            expected.Add("/Prestazione/data_ese[1]");

            XDocument document = XDocument.Load(IOHelper.ComposeSampleFilePath(FILE_NAME).Path);

            OperationResult<XPathList> actual = new XmlExtractor().GetXPaths(document, true, false, true);

            Assert.IsTrue(actual.Output.RootName.Equals("Prestazione"));
            Assert.IsTrue(expected.CompareList(actual.Output));
        }

        [TestMethod]
        public void GetXPathsFromDocument_Positional_Textual()
        {
            List<string> expected = new XPathList();
            expected.Add("/Prestazione/@cod_servizio");
            expected.Add("/Prestazione/@cod_flusso");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/piva_utente[1]/text()");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/piva_distr[1]/text()");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/cod_prat_utente[1]/text()");
            expected.Add("/Prestazione/IdentificativiRichiesta[1]/cod_prat_distr[1]/text()");
            expected.Add("/Prestazione/DatiTecnici[1]/cod_pdr[1]/text()");
            expected.Add("/Prestazione/data_ese[1]/text()");

            XDocument document = XDocument.Load(IOHelper.ComposeSampleFilePath(FILE_NAME).Path);

            OperationResult<XPathList> actual = new XmlExtractor().GetXPaths(document, true, true, true);

            Assert.IsTrue(actual.Output.RootName.Equals("Prestazione"));
            Assert.IsTrue(expected.CompareList(actual.Output));
        }
    }
}
